/*
 * Clase encargada de leer los documentos .XML para almacenar
 * los datos de los terrenos del juego y crear instancias de cada mapa.
 */
package fuente;

import fuente.estructuras.DLL;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class LectorXMLTerreno {
       
    private Matriz _matriz;
    private int _lengthColumnas,
                _lengthFilas;
    
    /**
     * Constructor, crea la instancia terreno.
     * @param pArchivo Nombre del archivo .XML a leer
     * @throws ParserConfigurationException
     * @throws SAXException
     * @throws IOException 
     */
    public LectorXMLTerreno (String pArchivo) throws ParserConfigurationException, 
                                                     SAXException, IOException {
        _lengthColumnas = _lengthFilas = 0;
        _matriz = new Matriz();
        leerXML (pArchivo);
    }
    
    /**
     * Metodo que inicializa el terreno por medio de una matriz de listas
     * doblemente enlazadas, de acuerdo a los datos contenidos en los archivos
     * .XML
     * @param pArchivo Nombre del archivo .XML a leer
     * @throws ParserConfigurationException
     * @throws SAXException
     * @throws IOException 
     */
    private void leerXML (String pArchivo) throws ParserConfigurationException,
                                                   SAXException, IOException {
        
        DocumentBuilderFactory docBF = DocumentBuilderFactory.newInstance();
        DocumentBuilder docB = docBF.newDocumentBuilder();
        org.w3c.dom.Document doc = docB.parse(new File("src/xml/"+pArchivo+".xml"));
        
        doc.getDocumentElement().normalize();
        
        NodeList listaColumnas = doc.getElementsByTagName("Columna");
        
        for (int i = 0; i < listaColumnas.getLength(); i++) {
            DLL celdas = new DLL();
            
            Node columna = listaColumnas.item(i);
            Element eColumna = (Element)(columna);
            
            NodeList listaCeldas = eColumna.getElementsByTagName("celd");
                       
            for (int j = 0; j < listaCeldas.getLength(); j++) {
                String datos;
                
                Node celda = listaCeldas.item(j);
                String contenido = celda.getTextContent();
                if (contenido.equals("")) {
                    Node tierra = celda.getFirstChild();
                    Element eTierra = (Element)(tierra);
                    
                    datos = eTierra.getAttribute("mineral");
                    celdas.insertar(datos);
                }
                else {
                    datos = celda.getTextContent();
                    celdas.insertar(datos);
                }
            }
            getMatriz().insertar(celdas);
        }
        this._lengthColumnas = _matriz.getLengthColumna();
        this._lengthFilas = _matriz.getLengthFilas();
    }

    /* Inicia implementacion de getters y setters */
    /**
     * Obtiene la matriz de terreno.
     * @return La matriz Terreno
     */
    public Matriz getMatriz() {
        return _matriz;
    }

    /**
     * Obtiene la cantidad de columnas de la matriz terreno.
     * @return Cantidad de columnas
     */
    public int getLengthColumnas() {
        return _lengthColumnas;
    }

    /**
     * Obtiene la cantidad de filas de la matriz terreno.
     * @return La cantidad de filas
     */
        
    public int getLengthFilas() {
        return _lengthFilas;
    }
    /**
     * Obtiene el dato de una celda especifica de la matriz terreno.
     * @param pIndI Indice de columnas
     * @param pIndJ Indice de Filas
     * @return El nombre del dato
     */
    
    public String getDatoCelda (int pIndI, int pIndJ) {
        String dato = _matriz.getDato(pIndI, pIndJ);
        return dato;
    }
    /* Final implementacion de getters y setters */    
}
